#!/bin/bash

# =============================================================================
# Admin服务统一管理脚本
# 作者: AI Assistant
# 创建时间: $(date +%Y-%m-%d)
# 功能: 启动、停止、重启、状态检查、日志查看等
# =============================================================================

# 配置参数
JAR_FOLDER="/mydata/jars/yccloud17/admin"
JAR_NAME="admin-0.0.1-SNAPSHOT.jar"
JAR_PATH="$JAR_FOLDER/$JAR_NAME"
LOG_FILE="$JAR_FOLDER/admin.log"
PID_FILE="$JAR_FOLDER/admin.pid"
APPLICATION_YML="$JAR_FOLDER/application.yml"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_debug() {
    echo -e "${BLUE}[DEBUG]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 打印分隔线
print_separator() {
    echo -e "${CYAN}========================================${NC}"
}

# 打印帮助信息
print_help() {
    echo -e "${CYAN}Admin服务管理脚本${NC}"
    echo "用法: $0 [命令] [选项]"
    echo
    echo "命令:"
    echo -e "  ${GREEN}start${NC}      - 启动服务"
    echo -e "  ${GREEN}stop${NC}       - 停止服务"
    echo -e "  ${GREEN}restart${NC}    - 重启服务"
    echo -e "  ${GREEN}status${NC}     - 查看服务状态"
    echo -e "  ${GREEN}logs${NC}       - 查看日志"
    echo -e "  ${GREEN}clean${NC}      - 清理日志和PID文件"
    echo -e "  ${GREEN}help${NC}       - 显示此帮助信息"
    echo
    echo "选项:"
    echo -e "  ${GREEN}-f${NC}         - 强制操作 (用于stop命令)"
    echo -e "  ${GREEN}-n [行数]${NC}  - 显示日志行数 (用于logs命令，默认50行)"
    echo -e "  ${GREEN}-t${NC}         - 实时跟踪日志 (用于logs命令)"
    echo
    echo "示例:"
    echo "  $0 start              # 启动服务"
    echo "  $0 stop               # 停止服务"
    echo "  $0 stop -f            # 强制停止服务"
    echo "  $0 restart            # 重启服务"
    echo "  $0 status             # 查看服务状态"
    echo "  $0 logs               # 查看最新50行日志"
    echo "  $0 logs -n 100        # 查看最新100行日志"
    echo "  $0 logs -t            # 实时跟踪日志"
    echo "  $0 clean              # 清理日志和PID文件"
}

# 检查Java环境
check_java() {
    if ! command -v java &> /dev/null; then
        log_error "Java未安装或不在PATH中"
        exit 1
    fi
    log_info "Java环境检查通过"
}

# 检查JAR文件
check_jar() {
    if [ ! -f "$JAR_PATH" ]; then
        log_error "JAR文件不存在: $JAR_PATH"
        exit 1
    fi
    log_info "JAR文件检查通过: $JAR_PATH"
}

# 检查服务状态
check_status() {
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if ps -p "$PID" > /dev/null 2>&1; then
            return 0
        else
            rm -f "$PID_FILE"
        fi
    fi
    
    PID=$(pgrep -f "$JAR_NAME")
    if [ -n "$PID" ]; then
        return 0
    fi
    
    return 1
}

# 启动服务
start_service() {
    log_info "启动Admin服务..."
    
    if check_status; then
        log_warn "服务已在运行，无需重复启动"
        return 0
    fi
    
    # 创建必要目录
    mkdir -p "$JAR_FOLDER"
    
    # 构建启动命令
    START_CMD="nohup java -jar"
    
    # JVM参数
    JVM_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError"
    START_CMD="$START_CMD $JVM_OPTS"
    
    # 配置文件
    if [ -f "$APPLICATION_YML" ]; then
        START_CMD="$START_CMD --spring.config.location=$APPLICATION_YML"
        log_info "使用配置文件: $APPLICATION_YML"
    else
        log_warn "配置文件不存在，使用默认配置"
    fi
    
    # 完整启动命令
    START_CMD="$START_CMD $JAR_PATH >> $LOG_FILE 2>&1 & echo \$! > $PID_FILE"
    
    # 执行启动
    eval $START_CMD
    
    # 等待启动
    sleep 3
    
    # 检查启动状态
    if check_status; then
        PID=$(cat "$PID_FILE" 2>/dev/null || pgrep -f "$JAR_NAME")
        log_info "服务启动成功！PID: $PID"
        log_info "日志文件: $LOG_FILE"
        return 0
    fi
    
    log_error "服务启动失败，请检查日志: $LOG_FILE"
    return 1
}

# 停止服务
stop_service() {
    local FORCE=$1
    local PID=""
    
    # 获取PID
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
    else
        PID=$(pgrep -f "$JAR_NAME")
    fi
    
    if [ -z "$PID" ]; then
        log_warn "未发现运行中的服务"
        return 0
    fi
    
    log_info "停止Admin服务 (PID: $PID)..."
    
    if [ "$FORCE" = "true" ]; then
        log_warn "强制停止服务..."
        kill -KILL "$PID"
        sleep 2
    else
        # 尝试优雅停止
        kill -TERM "$PID"
        
        # 等待进程优雅退出
        local TIMEOUT=30
        while [ $TIMEOUT -gt 0 ]; do
            if ! ps -p "$PID" > /dev/null 2>&1; then
                log_info "服务已优雅停止"
                break
            fi
            sleep 1
            ((TIMEOUT--))
        done
        
        # 如果优雅停止失败，强制停止
        if [ $TIMEOUT -eq 0 ]; then
            log_warn "优雅停止超时，强制停止..."
            kill -KILL "$PID"
            sleep 2
        fi
    fi
    
    # 清理PID文件
    if [ -f "$PID_FILE" ]; then
        rm -f "$PID_FILE"
        log_info "已清理PID文件"
    fi
    
    # 最终检查
    if pgrep -f "$JAR_NAME" > /dev/null 2>&1; then
        log_error "服务停止失败"
        return 1
    fi
    
    log_info "服务停止成功"
    return 0
}

# 重启服务
restart_service() {
    log_info "开始重启Admin服务..."
    
    # 停止服务
    if ! stop_service; then
        log_error "停止服务失败，重启终止"
        exit 1
    fi
    
    # 等待一段时间确保端口释放
    sleep 3
    
    # 启动服务
    if ! start_service; then
        log_error "启动服务失败，重启终止"
        exit 1
    fi
    
    log_info "Admin服务重启完成！"
}

# 显示服务状态
show_status() {
    print_separator
    echo -e "${CYAN}Admin服务状态报告${NC}"
    echo -e "${CYAN}生成时间: $(date '+%Y-%m-%d %H:%M:%S')${NC}"
    print_separator
    
    # Java环境
    echo -e "${CYAN}Java环境:${NC}"
    if command -v java &> /dev/null; then
        JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2)
        echo -e "  ${GREEN}✓${NC} Java版本: $JAVA_VERSION"
    else
        echo -e "  ${RED}✗${NC} Java未安装"
    fi
    
    # JAR文件
    echo -e "${CYAN}JAR文件:${NC}"
    if [ -f "$JAR_PATH" ]; then
        JAR_SIZE=$(du -h "$JAR_PATH" 2>/dev/null | cut -f1 || echo "未知")
        echo -e "  ${GREEN}✓${NC} 文件存在: $JAR_PATH (大小: $JAR_SIZE)"
    else
        echo -e "  ${RED}✗${NC} 文件不存在: $JAR_PATH"
    fi
    
    # 配置文件
    echo -e "${CYAN}配置文件:${NC}"
    if [ -f "$APPLICATION_YML" ]; then
        echo -e "  ${GREEN}✓${NC} 配置文件存在: $APPLICATION_YML"
    else
        echo -e "  ${YELLOW}⚠${NC} 配置文件不存在: $APPLICATION_YML"
    fi
    
    # 服务状态
    echo -e "${CYAN}服务状态:${NC}"
    if check_status; then
        PID=$(cat "$PID_FILE" 2>/dev/null || pgrep -f "$JAR_NAME")
        echo -e "  ${GREEN}✓${NC} 服务运行中 (PID: $PID)"
        
        # 进程信息
        if [ -n "$PID" ]; then
            PROCESS_INFO=$(ps -p "$PID" -o pid,ppid,user,comm,etime,pcpu,pmem --no-headers 2>/dev/null)
            if [ -n "$PROCESS_INFO" ]; then
                echo -e "  ${GREEN}✓${NC} 进程信息: $PROCESS_INFO"
            fi
        fi
    else
        echo -e "  ${RED}✗${NC} 服务未运行"
    fi
    
    # 日志文件
    echo -e "${CYAN}日志文件:${NC}"
    if [ -f "$LOG_FILE" ]; then
        LOG_SIZE=$(du -h "$LOG_FILE" 2>/dev/null | cut -f1 || echo "未知")
        echo -e "  ${GREEN}✓${NC} 日志文件: $LOG_FILE (大小: $LOG_SIZE)"
    else
        echo -e "  ${YELLOW}⚠${NC} 日志文件不存在: $LOG_FILE"
    fi
    
    print_separator
}

# 显示日志
show_logs() {
    local LINES=50
    local TAIL_FOLLOW=false
    
    # 解析参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -n)
                LINES="$2"
                shift 2
                ;;
            -t)
                TAIL_FOLLOW=true
                shift
                ;;
            *)
                shift
                ;;
        esac
    done
    
    if [ ! -f "$LOG_FILE" ]; then
        log_error "日志文件不存在: $LOG_FILE"
        exit 1
    fi
    
    if [ "$TAIL_FOLLOW" = "true" ]; then
        log_info "实时跟踪日志 (按 Ctrl+C 退出)..."
        tail -f "$LOG_FILE"
    else
        log_info "显示最新 $LINES 行日志..."
        tail -n "$LINES" "$LOG_FILE"
    fi
}

# 清理资源
clean_resources() {
    log_info "清理Admin服务资源..."
    
    # 清理PID文件
    if [ -f "$PID_FILE" ]; then
        rm -f "$PID_FILE"
        log_info "已清理PID文件: $PID_FILE"
    fi
    
    # 清理日志文件
    if [ -f "$LOG_FILE" ]; then
        # 备份旧日志
        BACKUP_LOG="${LOG_FILE}.$(date +%Y%m%d_%H%M%S).bak"
        mv "$LOG_FILE" "$BACKUP_LOG"
        log_info "已备份日志文件: $BACKUP_LOG"
        
        # 创建新的空日志文件
        touch "$LOG_FILE"
        log_info "已创建新的日志文件: $LOG_FILE"
    fi
    
    # 检查残留进程
    local remaining_pids=$(pgrep -f "$JAR_NAME")
    if [ -n "$remaining_pids" ]; then
        log_warn "发现残留进程: $remaining_pids"
        log_warn "如需清理，请手动执行: kill -9 $remaining_pids"
    fi
    
    log_info "资源清理完成"
}

# 主函数
main() {
    case "${1:-help}" in
        "start")
            check_java
            check_jar
            start_service
            ;;
        "stop")
            local FORCE=false
            if [ "$2" = "-f" ]; then
                FORCE=true
            fi
            stop_service "$FORCE"
            ;;
        "restart")
            check_java
            check_jar
            restart_service
            ;;
        "status")
            show_status
            ;;
        "logs")
            shift
            show_logs "$@"
            ;;
        "clean")
            clean_resources
            ;;
        "help"|"-h"|"--help")
            print_help
            ;;
        *)
            log_error "未知命令: $1"
            echo
            print_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"


